﻿///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2023, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Область ПрограммныйИнтерфейс

////////////////////////////////////////////////////////////////////////////////
// Работа с шаблонами офисных документов.

// Получает за один вызов всю необходимую информацию для печати: данные объектов по макетам, двоичные
// данные макетов, описание областей макетов.
// Для вызова из клиентских модулей печати форм по макетам офисных документов.
//
// Параметры:
//   ИмяМенеджераПечати - Строка - имя для обращения к менеджеру объекта, например "Документ.<Имя документа>".
//   ИменаМакетов       - Строка - имена макетов, по которым будут формироваться печатные формы.
//   СоставДокументов   - Массив - ссылки на объекты информационной базы (должны быть одного типа).
//
// Возвращаемое значение:
//  Соответствие из КлючИЗначение - коллекция ссылок на объекты и их данные:
//   * Ключ - ЛюбаяСсылка - ссылка на объект информационной базы;
//   * Значение - Структура:
//       ** Ключ - Строка - имя макета;
//       ** Значение - Структура - данные объекта.
//
Функция МакетыИДанныеОбъектовДляПечати(Знач ИмяМенеджераПечати, Знач ИменаМакетов, Знач СоставДокументов) Экспорт
	
	Возврат УправлениеПечатью.МакетыИДанныеОбъектовДляПечати(ИмяМенеджераПечати, ИменаМакетов, СоставДокументов);
	
КонецФункции

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

// Сформировать печатные формы для непосредственного вывода на принтер.
//
// Подробнее - см. описание УправлениеПечатью.СформироватьПечатныеФормыДляБыстройПечати().
//
Функция СформироватьПечатныеФормыДляБыстройПечати(ИмяМенеджераПечати, ИменаМакетов, МассивОбъектов,	ПараметрыПечати) Экспорт
	
	Возврат УправлениеПечатью.СформироватьПечатныеФормыДляБыстройПечати(ИмяМенеджераПечати, ИменаМакетов,
		МассивОбъектов,	ПараметрыПечати);
	
КонецФункции

// Сформировать печатные формы для непосредственного вывода на принтер в обычном приложении.
//
// Подробнее - см. описание УправлениеПечатью.СформироватьПечатныеФормыДляБыстройПечатиОбычноеПриложение().
//
Функция СформироватьПечатныеФормыДляБыстройПечатиОбычноеПриложение(ИмяМенеджераПечати, ИменаМакетов, МассивОбъектов, ПараметрыПечати) Экспорт
	
	Возврат УправлениеПечатью.СформироватьПечатныеФормыДляБыстройПечатиОбычноеПриложение(ИмяМенеджераПечати, ИменаМакетов,
		МассивОбъектов,	ПараметрыПечати);
	
КонецФункции

// Возвращает истину, если есть право проведения хотя бы для одного документа.
Функция ДоступноПравоПроведения(СписокДокументов) Экспорт
	Возврат СтандартныеПодсистемыСервер.ДоступноПравоПроведения(СписокДокументов);
КонецФункции

// См. УправлениеПечатью.ПакетДокументов.
Функция ПакетДокументов(ТабличныеДокументы, ОбъектыПечати, ПечататьКомплектами, КоличествоЭкземпляров = 1) Экспорт
	
	Возврат УправлениеПечатью.ПакетДокументов(ТабличныеДокументы, ОбъектыПечати,
		ПечататьКомплектами, КоличествоЭкземпляров);
	
КонецФункции

#Область ПечатьВФоновомЗадании

Функция НачатьФормированиеПечатныхФорм(ПараметрыОткрытияВходящий) Экспорт
	
	ПараметрыОткрытия = ОбщегоНазначения.СкопироватьРекурсивно(ПараметрыОткрытияВходящий);
	
	ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияФункции(ПараметрыОткрытия.УникальныйИдентификаторХранилища);
	ПараметрыВыполнения.АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, ПараметрыОткрытия.УникальныйИдентификаторХранилища);
	СодержимоеХранилищ = Неопределено;
	ИзвлечьИзХранилищ(ПараметрыОткрытия.ПараметрыПечати, СодержимоеХранилищ);
	ПараметрыОткрытия.Вставить("СодержимоеХранилищ", СодержимоеХранилищ);
	Если Не ЗначениеЗаполнено(ПараметрыОткрытия.ИсточникДанных) Тогда 
		ОбщегоНазначенияКлиентСервер.Проверить(ТипЗнч(ПараметрыОткрытия.ПараметрКоманды) = Тип("Массив") Или ОбщегоНазначения.ЗначениеСсылочногоТипа(ПараметрыОткрытия.ПараметрКоманды),
			СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр(
				"ru = 'Недопустимое значение параметра %1 при вызове метода %2.
				|Ожидалось: %3, %4.
				|Передано: %5'"),
				"ПараметрКоманды",
				"УправлениеПечатьюКлиент.ВыполнитьКомандуПечати",
				"Массив",
				"ЛюбаяСсылка",
				 ТипЗнч(ПараметрыОткрытия.ПараметрКоманды)));
	КонецЕсли;

	// Поддержка обратной совместимости с 2.1.3.
	ПараметрыПечати = ПараметрыОткрытия.ПараметрыПечати;
	Если ПараметрыОткрытия.ПараметрыПечати = Неопределено Тогда
		ПараметрыПечати = Новый Структура;
	КонецЕсли;
	Если Не ПараметрыПечати.Свойство("ДополнительныеПараметры") Тогда
		ПараметрыОткрытия.ПараметрыПечати = Новый Структура("ДополнительныеПараметры", ПараметрыПечати);
		Для Каждого ПараметрПечати Из ПараметрыПечати Цикл
			ПараметрыОткрытия.ПараметрыПечати.Вставить(ПараметрПечати.Ключ, ПараметрПечати.Значение);
		КонецЦикла;
	КонецЕсли;
			
	Возврат ДлительныеОперации.ВыполнитьФункцию(ПараметрыВыполнения, "УправлениеПечатью.СформироватьПечатныеФормыВФоне", ПараметрыОткрытия);
КонецФункции 

Процедура ИзвлечьИзХранилищ(СтруктураПараметров, СодержимоеХранилищ)
	Если СодержимоеХранилищ = Неопределено Тогда
		СодержимоеХранилищ = Новый Соответствие;
	КонецЕсли;
	
	ТипПараметров = ТипЗнч(СтруктураПараметров);
	Если ТипПараметров = Тип("Строка") И ЭтоАдресВременногоХранилища(СтруктураПараметров) Тогда
		СодержимоеХранилищ.Вставить(СтруктураПараметров, ПолучитьИзВременногоХранилища(СтруктураПараметров));
	ИначеЕсли ТипПараметров = Тип("Массив") Или ТипПараметров = Тип("ТаблицаЗначений") 
		Или ТипПараметров = Тип("СтрокаТаблицыЗначений") Или ТипПараметров = Тип("СтрокаДереваЗначений") Тогда
		
		Для Каждого Элемент Из СтруктураПараметров Цикл
			ИзвлечьИзХранилищ(Элемент, СодержимоеХранилищ);
		КонецЦикла;
	ИначеЕсли ТипПараметров = Тип("Структура") Или ТипПараметров = Тип("Соответствие") Тогда
		
		Для Каждого Элемент Из СтруктураПараметров Цикл
			ИзвлечьИзХранилищ(Элемент.Значение, СодержимоеХранилищ);
		КонецЦикла;
		
		Если ТипПараметров = Тип("Соответствие") Тогда
			Для Каждого Элемент Из СтруктураПараметров Цикл
				ИзвлечьИзХранилищ(Элемент.Ключ, СодержимоеХранилищ);
			КонецЦикла;
		КонецЕсли;

	ИначеЕсли  ТипПараметров = Тип("ДеревоЗначений") Тогда
		Для Каждого Элемент Из СтруктураПараметров.Строки Цикл
			ИзвлечьИзХранилищ(Элемент, СодержимоеХранилищ);
		КонецЦикла;
	КонецЕсли;
	
КонецПроцедуры
#КонецОбласти

#КонецОбласти
